<!DOCTYPE html>
<html lang="zh-Hans">

<!-- Head tag -->
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->
    
        <meta name="description" content="Note">
    

    <!--Author-->
    
        <meta name="author" content="兰陵忧患生">
    

    <!-- Title -->
    
    <title>Refactoring | Lan</title>

    <!-- Bootstrap Core CSS -->
    <link href="//cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet"
      href="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.12.0/build/styles/default.min.css">
    <script src="//cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.12.0/build/highlight.min.js"></script>

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/css/style.css">

    <!-- Custom Fonts -->
    <link href="//cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href='//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
    <link href='//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>

    <!-- Content -->
    <section class="article-container">
<!-- Back Home -->
<a class="nav-back" href="/">
    <i class="fa fa-puzzle-piece"></i>
</a>

<!-- Page Header -->
<header class="intro-header">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>Refactoring</h1>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">
            <!-- TOC -->
            <div class="toc-article col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
    <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#案例"><span class="toc-text">案例</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#重构原则"><span class="toc-text">重构原则</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#何时重构"><span class="toc-text">何时重构</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#三次法则"><span class="toc-text">三次法则</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#添加功能时重构"><span class="toc-text">添加功能时重构</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#修补错误时重构"><span class="toc-text">修补错误时重构</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#复审代码时重构"><span class="toc-text">复审代码时重构</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#重构的难题"><span class="toc-text">重构的难题</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#代码的坏味道"><span class="toc-text">代码的坏味道</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#Duplicated-Code（重复代码）"><span class="toc-text">Duplicated Code（重复代码）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Long-Method-（过长函数）"><span class="toc-text">Long Method （过长函数）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Long-Class-（过长的类）"><span class="toc-text">Long Class （过长的类）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Long-Parameter-List-（过长参数列）"><span class="toc-text">Long Parameter List （过长参数列）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Divergent-Change-（发散式变化）"><span class="toc-text">Divergent Change （发散式变化）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Shotgun-Surgery-（霰弹式修改）"><span class="toc-text">Shotgun Surgery （霰弹式修改）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Feature-Envy（依恋情结）"><span class="toc-text">Feature Envy（依恋情结）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Data-Clumps-（数据泥团）"><span class="toc-text">Data Clumps （数据泥团）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Primitive-Obsession-（基本类型偏执）"><span class="toc-text">Primitive Obsession （基本类型偏执）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Switch-Statements-（switch-惊悚现身）"><span class="toc-text">Switch Statements （switch 惊悚现身）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Parallel-Inheritance-Hierarchies-（平行继承体系）"><span class="toc-text">Parallel Inheritance Hierarchies （平行继承体系）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Lazy-Class-（冗赘类）"><span class="toc-text">Lazy Class （冗赘类）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Speculative-Generality-（夸夸其谈未来性）"><span class="toc-text">Speculative Generality （夸夸其谈未来性）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Temporary-Field-（令人迷惑的暂时字段）"><span class="toc-text">Temporary Field （令人迷惑的暂时字段）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Message-Chains-（过度耦合的消息链）"><span class="toc-text">Message Chains （过度耦合的消息链）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Middle-Man-（中间人）"><span class="toc-text">Middle Man （中间人）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Inappropriate-Intimacy-（狎xia昵ni关系）"><span class="toc-text">Inappropriate Intimacy （狎xia昵ni关系）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Alternative-Classes-with-Different-Interfaces-（异曲同工的类）"><span class="toc-text">Alternative Classes with Different Interfaces （异曲同工的类）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Incomplete-Library-Class-（不完美的库类）"><span class="toc-text">Incomplete Library Class （不完美的库类）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Data-Class-（纯稚的数据类）"><span class="toc-text">Data Class （纯稚的数据类）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Refused-Bequest-（被拒绝的馈赠）"><span class="toc-text">Refused Bequest （被拒绝的馈赠）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Comments-（过多的注释）"><span class="toc-text">Comments （过多的注释）</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#构筑测试体系"><span class="toc-text">构筑测试体系</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#重构列表"><span class="toc-text">重构列表</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#重构记录的格式"><span class="toc-text">重构记录的格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#重构手法有多成熟"><span class="toc-text">重构手法有多成熟</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#重新组织函数"><span class="toc-text">重新组织函数</span></a></li></ol>
</div>

            <!-- Post Main Content -->
            <div class="post-content col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul>
<li>重构是</li>
</ul>
<blockquote>
<p>在不改变软件可观察行为的前提下改善其内部结构。</p>
</blockquote>
<h2 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h2><ul>
<li>变量名称是代码清晰的关键。</li>
<li>最好不要在另一个对象的属性基础上运用 switch 语句。</li>
</ul>
<h2 id="重构原则"><a href="#重构原则" class="headerlink" title="重构原则"></a>重构原则</h2><ul>
<li>消除重复代码，确定所有事物和行为在代码中只表述一次。</li>
</ul>
<h3 id="何时重构"><a href="#何时重构" class="headerlink" title="何时重构"></a>何时重构</h3><h4 id="三次法则"><a href="#三次法则" class="headerlink" title="三次法则"></a>三次法则</h4><ul>
<li>事不过三，三则重构。</li>
</ul>
<h4 id="添加功能时重构"><a href="#添加功能时重构" class="headerlink" title="添加功能时重构"></a>添加功能时重构</h4><ul>
<li>代码的设计无法帮助我轻松添加我所需要的特性。</li>
</ul>
<h4 id="修补错误时重构"><a href="#修补错误时重构" class="headerlink" title="修补错误时重构"></a>修补错误时重构</h4><h4 id="复审代码时重构"><a href="#复审代码时重构" class="headerlink" title="复审代码时重构"></a>复审代码时重构</h4><h3 id="重构的难题"><a href="#重构的难题" class="headerlink" title="重构的难题"></a>重构的难题</h3><ul>
<li>数据库</li>
<li>修改接口<ul>
<li>不要过早发布接口，请修改你的代码所有权政策，使重构更顺畅。</li>
</ul>
</li>
<li>难以通过重构手法完成的设计改动</li>
<li>何时不该重构</li>
</ul>
<h2 id="代码的坏味道"><a href="#代码的坏味道" class="headerlink" title="代码的坏味道"></a>代码的坏味道</h2><h3 id="Duplicated-Code（重复代码）"><a href="#Duplicated-Code（重复代码）" class="headerlink" title="Duplicated Code（重复代码）"></a>Duplicated Code（重复代码）</h3><ul>
<li><p>Method</p>
<ul>
<li>Extract Method (110)</li>
<li>Pull Up Method (332)</li>
<li>Form Template Method (345)</li>
<li>Substitute Algorithm (139)</li>
<li>Extract Class (149)</li>
</ul>
</li>
</ul>
<h3 id="Long-Method-（过长函数）"><a href="#Long-Method-（过长函数）" class="headerlink" title="Long Method （过长函数）"></a>Long Method （过长函数）</h3><ul>
<li><p>Method</p>
<ul>
<li>Extract Method (110)</li>
<li>Replace Temp with Query (120)</li>
<li>Introduce Parameter Object (295)</li>
<li>Preserve Whole Object (135)</li>
<li>Decompose Condition (238)</li>
</ul>
</li>
</ul>
<h3 id="Long-Class-（过长的类）"><a href="#Long-Class-（过长的类）" class="headerlink" title="Long Class （过长的类）"></a>Long Class （过长的类）</h3><ul>
<li><p>Method</p>
<ul>
<li>Extract Class (149)</li>
<li>Extract Subclass (330)</li>
<li>Extract Interface (341)</li>
<li>Duplicate Observed Data (189)</li>
</ul>
</li>
</ul>
<h3 id="Long-Parameter-List-（过长参数列）"><a href="#Long-Parameter-List-（过长参数列）" class="headerlink" title="Long Parameter List （过长参数列）"></a>Long Parameter List （过长参数列）</h3><ul>
<li><p>Method</p>
<ul>
<li>Replace Parameter with Method (292)</li>
<li>Preserve Whole Object (288)</li>
<li>Introduce Parameter Object (295)</li>
</ul>
</li>
</ul>
<h3 id="Divergent-Change-（发散式变化）"><a href="#Divergent-Change-（发散式变化）" class="headerlink" title="Divergent Change （发散式变化）"></a>Divergent Change （发散式变化）</h3><ul>
<li><p>一个类受多种变化的影响。</p>
</li>
<li><p>针对某一外界变化的所有相应修改，都只应该发生在单一类中，而这个新类内的所有内容都应该反应此变化。</p>
</li>
<li><p>Method</p>
<ul>
<li>Extract Class (149)</li>
</ul>
</li>
</ul>
<h3 id="Shotgun-Surgery-（霰弹式修改）"><a href="#Shotgun-Surgery-（霰弹式修改）" class="headerlink" title="Shotgun Surgery （霰弹式修改）"></a>Shotgun Surgery （霰弹式修改）</h3><ul>
<li><p>一个变化引起多个类相应的修改。</p>
</li>
<li><p>Method</p>
<ul>
<li>Move Method (142)</li>
<li>Move Field (146)</li>
<li>Inline Class (154)</li>
</ul>
</li>
</ul>
<h3 id="Feature-Envy（依恋情结）"><a href="#Feature-Envy（依恋情结）" class="headerlink" title="Feature Envy（依恋情结）"></a>Feature Envy（依恋情结）</h3><ul>
<li>函数对某个类的兴趣高过对自己所处类的兴趣。</li>
<li><p>一个函数会用到几个类的功能：判断哪个类拥有最多被此函数使用的数据，然后就把这个函数和那些数据摆在一起。</p>
</li>
<li><p>Method</p>
<ul>
<li>Move Method (142)</li>
<li>Extract Method (110)</li>
</ul>
</li>
</ul>
<h3 id="Data-Clumps-（数据泥团）"><a href="#Data-Clumps-（数据泥团）" class="headerlink" title="Data Clumps （数据泥团）"></a>Data Clumps （数据泥团）</h3><ul>
<li><p>不必在意 Data Clumps 只用上新对象的一部分字段。</p>
</li>
<li><p>Method</p>
<ul>
<li>Extract Class (149)</li>
<li>Introduce Parameter Object (295)</li>
<li>Preserve Whole Object (288)</li>
</ul>
</li>
</ul>
<h3 id="Primitive-Obsession-（基本类型偏执）"><a href="#Primitive-Obsession-（基本类型偏执）" class="headerlink" title="Primitive Obsession （基本类型偏执）"></a>Primitive Obsession （基本类型偏执）</h3><ul>
<li><p>Method</p>
<ul>
<li>Replace Data Value with Object (175)</li>
<li>Replace Type Code with Class (218)</li>
<li>Replace Type Code with Subclasses (223)</li>
<li>Replace Type Code with State/Strategy (227)</li>
</ul>
</li>
</ul>
<h3 id="Switch-Statements-（switch-惊悚现身）"><a href="#Switch-Statements-（switch-惊悚现身）" class="headerlink" title="Switch Statements （switch 惊悚现身）"></a>Switch Statements （switch 惊悚现身）</h3><ul>
<li><p>Switch 语句的问题在于重复</p>
</li>
<li><p>Method</p>
<ul>
<li>Extract Method (110)</li>
<li>Move Method (142)</li>
<li>Replace Type Code with Subclasses (223)</li>
<li>Replace Type Code with State/Strategy (227)</li>
<li>Replace Conditional with Polymorphism (255)</li>
<li>Replace Parameter with Explicit Methods (285)</li>
<li>Introduce Null Object (260)</li>
</ul>
</li>
</ul>
<h3 id="Parallel-Inheritance-Hierarchies-（平行继承体系）"><a href="#Parallel-Inheritance-Hierarchies-（平行继承体系）" class="headerlink" title="Parallel Inheritance Hierarchies （平行继承体系）"></a>Parallel Inheritance Hierarchies （平行继承体系）</h3><ul>
<li><p>让一个继承体系的实例引用另一个继承体系的实例</p>
</li>
<li><p>Method</p>
<ul>
<li>Move Method (142)</li>
<li>Move Field (146)</li>
</ul>
</li>
</ul>
<h3 id="Lazy-Class-（冗赘类）"><a href="#Lazy-Class-（冗赘类）" class="headerlink" title="Lazy Class （冗赘类）"></a>Lazy Class （冗赘类）</h3><ul>
<li><p>Method</p>
<ul>
<li>Collapse Hierarchy (344)</li>
<li>Inline Class (154)</li>
</ul>
</li>
</ul>
<h3 id="Speculative-Generality-（夸夸其谈未来性）"><a href="#Speculative-Generality-（夸夸其谈未来性）" class="headerlink" title="Speculative Generality （夸夸其谈未来性）"></a>Speculative Generality （夸夸其谈未来性）</h3><ul>
<li><p>如果函数和类的唯一用户是测试用例。</p>
</li>
<li><p>Method</p>
<ul>
<li>Collapse Hierarchy (344)</li>
<li>Inline Class (154)</li>
<li>Remove Parameter (277)</li>
<li>Rename Method (273)</li>
</ul>
</li>
</ul>
<h3 id="Temporary-Field-（令人迷惑的暂时字段）"><a href="#Temporary-Field-（令人迷惑的暂时字段）" class="headerlink" title="Temporary Field （令人迷惑的暂时字段）"></a>Temporary Field （令人迷惑的暂时字段）</h3><ul>
<li><p>Method</p>
<ul>
<li>Extract Class (149)</li>
<li>Introduce Null Object (260)</li>
</ul>
</li>
</ul>
<h3 id="Message-Chains-（过度耦合的消息链）"><a href="#Message-Chains-（过度耦合的消息链）" class="headerlink" title="Message Chains （过度耦合的消息链）"></a>Message Chains （过度耦合的消息链）</h3><ul>
<li><p>客户代码将与查找过程中的导航结构紧密结合。</p>
</li>
<li><p>Method</p>
<ul>
<li>Hide Delegate (157)</li>
<li>Extract Method (110)</li>
<li>Move Method (142)</li>
</ul>
</li>
</ul>
<h3 id="Middle-Man-（中间人）"><a href="#Middle-Man-（中间人）" class="headerlink" title="Middle Man （中间人）"></a>Middle Man （中间人）</h3><ul>
<li><p>过度使用委托。</p>
</li>
<li><p>Method</p>
<ul>
<li>Remove Middle Method (160)</li>
<li>Inline Method (117)</li>
<li>Replace Delegation with Inheritance (355)</li>
</ul>
</li>
</ul>
<h3 id="Inappropriate-Intimacy-（狎xia昵ni关系）"><a href="#Inappropriate-Intimacy-（狎xia昵ni关系）" class="headerlink" title="Inappropriate Intimacy （狎xia昵ni关系）"></a>Inappropriate Intimacy （狎xia昵ni关系）</h3><ul>
<li>两个类过于亲密</li>
<li><p>Method</p>
<ul>
<li>Move Method (142)</li>
<li>Change Bidirectional Association to Unidirectional (200)</li>
<li>Extract Class (149)</li>
<li>Hide Delegate (157)</li>
<li>Replace Inheritance with Delegation (352)</li>
</ul>
</li>
</ul>
<h3 id="Alternative-Classes-with-Different-Interfaces-（异曲同工的类）"><a href="#Alternative-Classes-with-Different-Interfaces-（异曲同工的类）" class="headerlink" title="Alternative Classes with Different Interfaces （异曲同工的类）"></a>Alternative Classes with Different Interfaces （异曲同工的类）</h3><ul>
<li><p>如果两个函数做同一件事，却有着不用的签名。</p>
</li>
<li><p>Method</p>
<ul>
<li>Rename Method (273)</li>
<li>Move Method (142)</li>
<li>Extract Superclass (336)</li>
</ul>
</li>
</ul>
<h3 id="Incomplete-Library-Class-（不完美的库类）"><a href="#Incomplete-Library-Class-（不完美的库类）" class="headerlink" title="Incomplete Library Class （不完美的库类）"></a>Incomplete Library Class （不完美的库类）</h3><ul>
<li><p>Method</p>
<ul>
<li>Introduce Foreign Method (162)</li>
<li>Introduce Local Extension (164) </li>
</ul>
</li>
</ul>
<h3 id="Data-Class-（纯稚的数据类）"><a href="#Data-Class-（纯稚的数据类）" class="headerlink" title="Data Class （纯稚的数据类）"></a>Data Class （纯稚的数据类）</h3><ul>
<li><p>不会说话的数据容器</p>
</li>
<li><p>Method</p>
<ul>
<li>Encapsulate Field (206)</li>
<li>Encapsulate Collection (208)</li>
<li>Remove Setting Method (300)</li>
<li>Move Method (142)</li>
<li>Extract Method (110)</li>
<li>Hide Method (303)</li>
</ul>
</li>
</ul>
<h3 id="Refused-Bequest-（被拒绝的馈赠）"><a href="#Refused-Bequest-（被拒绝的馈赠）" class="headerlink" title="Refused Bequest （被拒绝的馈赠）"></a>Refused Bequest （被拒绝的馈赠）</h3><ul>
<li><p>Method</p>
<ul>
<li>Push Down Method (208)</li>
<li>Push Down Field (329)</li>
<li>Replace Inheritance with Delegation (352)</li>
</ul>
</li>
</ul>
<h3 id="Comments-（过多的注释）"><a href="#Comments-（过多的注释）" class="headerlink" title="Comments （过多的注释）"></a>Comments （过多的注释）</h3><ul>
<li><p>当你感觉需要撰写注释时，请先尝试重构，试着让所有注释都变得多余。</p>
</li>
<li><p>Method</p>
<ul>
<li>Extract Method (110)</li>
<li>Rename Method (273)</li>
<li>Introduce Assertion (267)</li>
</ul>
</li>
</ul>
<h2 id="构筑测试体系"><a href="#构筑测试体系" class="headerlink" title="构筑测试体系"></a>构筑测试体系</h2><ul>
<li>频繁运行测试</li>
<li>编写测试代码时，往往一开始先让它们失败</li>
<li>每当收到 bug 报告时，请写一个单元测试来暴露这个 bug</li>
<li>测试你最担心出错的部分</li>
<li>考虑可能出错的边界条件 （包括特殊的，可能导致测试失败的情况）</li>
<li>当事情被认为应该会出错时，别忘了检查是否抛出了预期的异常</li>
</ul>
<h2 id="重构列表"><a href="#重构列表" class="headerlink" title="重构列表"></a>重构列表</h2><h3 id="重构记录的格式"><a href="#重构记录的格式" class="headerlink" title="重构记录的格式"></a>重构记录的格式</h3><ul>
<li>名称 (name)</li>
<li>概要 (summary)</li>
<li>动机 (motivation)</li>
<li>做法 (mechanics)</li>
<li>范例 (examples)</li>
</ul>
<h3 id="重构手法有多成熟"><a href="#重构手法有多成熟" class="headerlink" title="重构手法有多成熟"></a>重构手法有多成熟</h3><ul>
<li>小步前进，频繁测试</li>
<li>设计模式为重构行为提供了目标</li>
</ul>
<h2 id="重新组织函数"><a href="#重新组织函数" class="headerlink" title="重新组织函数"></a>重新组织函数</h2><ul>
<li><p>Extract Method （提炼函数）</p>
<ul>
<li>局部变量</li>
</ul>
</li>
<li><p>Inline Method （内联函数）</p>
</li>
<li><p>Inline Temp （内联临时变量）</p>
</li>
<li><p>Replace Temp with Query （以查询取代临时变量）</p>
</li>
<li></li>
</ul>

 
                <!-- Meta -->
                <div class="post-meta">
                    <hr>
                    <br>
                    <div class="post-tags">
                        
                            

<a href="/tags/Java-refactoring/">#Java, refactoring</a>


                        
                    </div>
                    <div class="post-date">
                        2017 年 10 月 08 日
                    </div>
                </div>
            </div>

            <!-- Comments -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <!-- Disqus Comments -->


            </div>
        </div>
    </div>
</article>
</section>

    <!-- Scripts -->
    <!-- jQuery -->
<script src="//cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>
<!-- Bootstrap -->
<script src="//cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<script type="text/javascript">
	hljs.initHighlightingOnLoad();
	console.log('Hexo-theme-hollow designed by zchen9 http://www.chen9.info © 2015-' + (new Date()).getFullYear());
</script>

    <!-- Google Analytics -->
    

</body>

</html>